package Servlets;

import Estructuras.Principales.PrincipalSistemaDTO;
import Herramientas.Herramientas;
import Herramientas.RedireccionPOPUP;
import SistemaDAOS.ServiciosAsignadosUsuarioDAO;
import SistemaDAOS.UsersDAO;
import SistemaDAOS.UsersDataDAO;
import SistemaDTOS.UsersDTO;
import SistemaDTOS.UsersDataDTO;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Mauricio Alan
 */
@WebServlet(name = "Users", urlPatterns = {"/Users"})
public class Users extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            HttpSession session = request.getSession();
            String action = request.getParameter("action");
            Herramientas herremintas = new Herramientas();

            UsersDAO usersDAO = new UsersDAO();
            UsersDataDAO usersDataDAO = new UsersDataDAO();
            ServiciosAsignadosUsuarioDAO sauDAO = new ServiciosAsignadosUsuarioDAO();

            if (action.equals("showForm")) {
                Vector vErrores = new Vector();
                vErrores.clear();
                PrincipalSistemaDTO principal = new PrincipalSistemaDTO();
                Vector anios, meses, dias;
                anios = herremintas.aniosCombo();
                meses = herremintas.mesesCombo();
                dias = herremintas.diasCombo();

                principal.setAniosCombo(anios);
                principal.setMesesCombo(meses);
                principal.setDiasCombo(dias);

                principal.setErrores(vErrores);
                principal.setnErrores(vErrores.size());
                session.setAttribute("principalSistema", principal);
                RequestDispatcher d = request.getRequestDispatcher("SistemaJSP/addUser.jsp");
                d.forward(request, response);

            } else if (action.equals("requestData")) {

                Vector vErrores = new Vector();

                String user = request.getParameter("user");
                if (user.toString().length() == 0) {
                    vErrores.add("El Campo usuario Es Obligatorio");
                } else {
                }

                String email = request.getParameter("emailUser");
                if (email.toString().length() == 0) {
                    vErrores.add("El campo email Es Obligatorio");
                } else {
                }

                String password = request.getParameter("pass");
                if (password.toString().length() == 0) {
                    vErrores.add("El Campo Password Es Obligatorio");
                } else {
                }

                String passwordAgain = request.getParameter("passAgain");
                if (passwordAgain.toString().length() == 0) {
                    vErrores.add("Es Obligatorio Repetir su password");
                } else {
                }

                if (password.equals(passwordAgain)) {
                } else {
                    vErrores.add("Las Contraseñas No Coinciden");
                }

                PrincipalSistemaDTO principal = new PrincipalSistemaDTO();
                if (vErrores.size() > 0) {
                    principal.setErrores(vErrores);
                    principal.setnErrores(vErrores.size());
                    session.setAttribute("principalSistema", principal);
                    RequestDispatcher d = request.getRequestDispatcher("SistemaJSP/addUser.jsp");
                    d.forward(request, response);

                } else if (vErrores.size() == 0) {
                    // SI NO HAY INCIDENCIAS SE BUSCAN LOS DATOS PROPORCIONADOS EN LA BASE DE DATOS
                    Vector vAdvertencias = new Vector();

                    int buscarUsuario = usersDAO.BuscarUsername(user);
                    if (buscarUsuario > 0) {
                        vAdvertencias.add("El Nombre de Usuario Ya existe");
                    }

                    int buscarEmail = usersDAO.BuscarEmail(email);
                    if (buscarEmail > 0) {
                        vAdvertencias.add("El Email Ya esta en uso");
                    }

                    if (vAdvertencias.size() > 0) {
                        principal.setvAdvertencias(vAdvertencias);
                        principal.setnAdvertencias(vAdvertencias.size());
                        session.setAttribute("principalSistema", principal);
                        RequestDispatcher d = request.getRequestDispatcher("SistemaJSP/addUser.jsp");
                        d.forward(request, response);

                    } else if (vAdvertencias.isEmpty()) {
                        // REGISTRO
                        vErrores.clear();
                        vAdvertencias.clear();
                        PrincipalSistemaDTO principal2 = new PrincipalSistemaDTO();
                        principal2.setnErrores(0);
                        principal2.setnAdvertencias(0);
                        usersDAO.nuevoUsuario(user, password, email);

                        UsersDTO registrado = new UsersDTO();
                        registrado.setName(user);
                        registrado.setEmail(email);
                        int idDelRegistrado = usersDAO.idUsuario(registrado);
                        registrado.setId(idDelRegistrado);
                        
                        // NUEVA COLUMNA DE SERVICIOS
                        sauDAO.columnaServiciosUsuarioNuevo(user);
                        // NUEVA COLUMNA DE SERVICIOS

                        // se manda el id del usuario registrado como un apuntador en sesion
                        session.setAttribute("idRegistradoApuntador", idDelRegistrado);
                        session.setAttribute("emailRegistradoApuntador", email);
                        session.setAttribute("principalSistema", principal2);
                      
                        RequestDispatcher g = request.getRequestDispatcher("./Users?action=infoPartner&index=1");
                        g.forward(request, response);

                    }
                }
            } else if (action.equals("infoPartner")) {
                int index = Integer.parseInt(request.getParameter("index"));

                switch (index) {
                    case 1: // MOSTRAMOS JSP DE GENERALES
                        PrincipalSistemaDTO principal = (PrincipalSistemaDTO) session.getAttribute("principalSistema");
                        principal.setDiasCombo(herremintas.diasCombo());
                        principal.setMesesCombo(herremintas.mesesCombo());
                        principal.setAniosCombo(herremintas.aniosCombo());
                        session.setAttribute("principalSistema", principal);
                        RequestDispatcher d = request.getRequestDispatcher("SistemaJSP/generales.jsp");
                        d.forward(request, response);
                        break;

                    case 2:
// RECUPERAMOS DATOS // MANEJAMOS EVENTOS // GENERAMOS REGISTROS

                        Vector errores = new Vector();
                        UsersDataDTO usersData = new UsersDataDTO();

                        // CARGO LOS APUNTAORES DE SESION
                        int idApuntador = (Integer) session.getAttribute("idRegistradoApuntador");
                        usersData.setIdUser(idApuntador);

                        String emailApuntador = (String) session.getAttribute("emailRegistradoApuntador");
                        usersData.setMail(emailApuntador);

                        // BLOQUE DE VALIDACIONES JAVA 
                        String nombre = new String();
                        if (request.getParameter("nombre").toString().length() > 0) {
                            nombre = request.getParameter("nombre");
                            usersData.setNombre(nombre);
                        } else {
                            errores.add("EL CAMPO NOMBRE(S) ES OBLIGATORIO");
                        }

                        // APELLIDO MATERNO
                        String apMat = new String();
                        if (request.getParameter("apMaterno").toString().length() > 0) {
                            apMat = request.getParameter("apMaterno");
                            usersData.setApMaterno(apMat);
                        } else {
                            errores.add("EL CAMPO APELLIDO PATERNO MATERNO ES OBLIGATORIO");
                        }

                        // APELLIDO PATERNO
                        String apPat = new String();
                        if (request.getParameter("apPaterno").toString().length() > 0) {
                            apPat = request.getParameter("apPaterno");
                            usersData.setApPaterno(apPat);
                        } else {
                            errores.add("EL CAMPO APELLIDO PATERNO");
                        }

                        String domicilio = new String();
                        if (request.getParameter("direccion").toString().length() > 0) {
                            domicilio = request.getParameter("direccion");
                            usersData.setDireccion(domicilio);
                        } else {
                            errores.add("EL CAMPO DIRECCION ES OBLIGARIO");
                        }

                        String telefono = new String();
                        if (request.getParameter("telefono").toString().length() > 0) {
                            telefono = request.getParameter("telefono");
                            usersData.setTelefono(telefono);
                        } else {
                            errores.add("EL CAMPO DE TELEFONO ES OBLIGATORIO");
                        }

                        String celular = new String();
                        if (request.getParameter("celular").toString().length() > 0) {
                            celular = request.getParameter("celular");
                            usersData.setCelular(celular);
                        } else {
                            errores.add("EL CAMPO CELULAR ES OBLIGATORIO");
                        }

                        int diaNacimiento = Integer.parseInt(request.getParameter("nDia"));
                        int mesNacimiento = Integer.parseInt(request.getParameter("nMes"));
                        int anioNacimiento = Integer.parseInt(request.getParameter("nAnio"));

                        if (diaNacimiento == 0) {
                            errores.add("DEBE SELECCIONAR UN DIA DE FECHA NACIMIENTO");
                        } else {
                            usersData.setDiaNacimiento(diaNacimiento);
                        }

                        if (mesNacimiento == 0) {
                            errores.add("DEBE SELECCIONAR UN MES DE FECHA NACIMIENTO");
                        } else {
                            usersData.setMesNacimiento(mesNacimiento);
                        }

                        if (anioNacimiento == 0) {
                            errores.add("DEBE SELECCIONAR UN AÑO DE FECHA NACIMIENTO");
                        } else {
                            usersData.setAnioNacimiento(anioNacimiento);
                        }

                        PrincipalSistemaDTO principal2 = (PrincipalSistemaDTO) session.getAttribute("principalSistema");

                        if (errores.size() > 0) {
                            principal2.setnErrores(errores.size());
                            principal2.setErrores(errores);
                            principal2.setUsersDataDTO(usersData);
                            session.setAttribute("principalSistema", principal2);
                            RequestDispatcher img = request.getRequestDispatcher("SistemaJSP/generales.jsp");
                            img.forward(request, response);

                        } else {
                            usersDataDAO.agregarInformacionUsuario(usersData);
                            String redireccion ="./AdminSys?action=principal";
                            session.setAttribute("redireccion", redireccion);
                            RequestDispatcher g = request.getRequestDispatcher("./loadingFull.jsp");
                            g.forward(request, response);
                        }
                        break;
                }

            } else if (action.equals("lock")) {
                int id = Integer.parseInt(request.getParameter("id"));
                int index = Integer.parseInt(request.getParameter("index"));
                switch (index) {
                    case 1:
                        PrincipalSistemaDTO principalSistemaDTO = (PrincipalSistemaDTO) session.getAttribute("principalSistema");
                        UsersDTO usuarioApuntador = usersDAO.userPorID(id);
                        principalSistemaDTO.setUsuarioApuntador(usuarioApuntador);
                        session.setAttribute("principalSistema", principalSistemaDTO);
                        RequestDispatcher d = request.getRequestDispatcher("SistemaJSP/estadoPerfil.jsp");
                        d.forward(request, response);
                        break;
                    case 2:
                        int idUser = Integer.parseInt(request.getParameter("id"));
                        int flag = Integer.parseInt(request.getParameter("flag"));
                        usersDAO.cambiarEstadoUsuario(id, flag);
                        RedireccionPOPUP redireccion = new RedireccionPOPUP();
                        redireccion.setServicio("AdminSys?action=principal");
                        session.setAttribute("sistema", redireccion);
                        RequestDispatcher e = request.getRequestDispatcher("./loading.jsp");
                        e.forward(request, response);
                        break;
                }
            }

        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
